package com.wmx.mp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wmx.mp.config.MybatisPlusConfig;
import com.wmx.mp.entity.BasUser;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * @author wangMaoXiong
 * @version 1.0
 * @date 2023/3/4 8:55
 */
public interface IBasUserService {

    /**
     * 分页查询必须配置分页拦截器才会生效 {@link MybatisPlusConfig}，否则不会分页，而是查询全部。
     *
     * @param page    ：当前页，从1开始。
     * @param count   ：每页显示条数
     * @param keyword ：模糊查询的关键字
     * @return
     */
    IPage<BasUser> selectPage(Integer page, Integer count, String keyword);

    /**
     * 根据 ID 查询
     *
     * @param id ：主键ID
     * @return
     */
    BasUser selectById(Integer id);

    /**
     * 查询（根据ID 批量查询）
     *
     * @param ids ：主键ID集合
     * @return
     */
    List<BasUser> selectBatchIds(List<Integer> ids);

    /**
     * 查询（根据 columnMap 条件）
     *
     * @param columnMap ：表字段 map 对象，key 对应表中的列名，而不是实体对象的属性名。
     */
    List<BasUser> selectByMap(Map<String, Object> columnMap);

    /**
     * 根据 entity 条件，查询一条记录。
     * 例如 qw.last("limit 1") 限制取一条记录, 注意：如果结果是多条数据，则会报异常：TooManyResultsException
     *
     * @param id ：主键ID
     */
    BasUser selectOne(Integer id);

    List<Object> selectObjs(String email);

    /**
     * 根据 Wrapper 条件，查询总记录数
     */
    Long selectCount();

    /**
     * 条件构造器 QueryWrapper 查询API
     *
     * @param keyword
     * @return
     */
    List<BasUser> queryWrapper(String keyword, Integer userId, String birthday, List<String> names);

    /**
     * LambdaQueryWrapper：Lambda 语法使用 Wrapper，使用实体对象属性名自动映射数据库表列名，而不用写死列名。
     *
     * @param keyword
     * @param userId
     * @param birthday
     * @param names
     * @return
     */
    List<BasUser> lambdaQueryWrapper(String keyword, Integer userId, String birthday, List<String> names);

    /**
     * 查询表中一共有多少条数据
     *
     * @return
     */
    int countAll();

    /**
     * 批量新增保存
     *
     * @param basUserList ：待新增保存的数据
     */
    void insertList(List<BasUser> basUserList);

    /**
     * 批量更新保存
     *
     * @param basUserList ：待更新保存的数据
     */
    void updateById(List<BasUser> basUserList);

    /**
     * int update(T entity, Wrapper<T> updateWrapper)
     * 根据 whereEntity 条件，更新记录
     *
     * @param basUser
     */
    void update(BasUser basUser);

    /**
     * 批量删除
     *
     * @param basUserList ：待删除的数据
     */
    void deleteBatchIds(List<BasUser> basUserList);

    /**
     * 根据主键 ID 删除
     *
     * @param id 主键ID
     */
    void deleteById(Integer id);

    /**
     * 根据主键 ID 删除：int deleteById(Serializable id)
     * 根据实体(ID)删除：int deleteById(T entity);
     *
     * @param basUser ：实体对象
     */
    void deleteById(BasUser basUser);

    /**
     * 根据 columnMap 条件，删除记录
     *
     * @param columnMap: 表字段 map 对象，key是表中的列名，而不是实体对象的属性名。
     */
    void deleteByMap(Map<String, Object> columnMap);

    /**
     * 根据 entity 条件，删除记录
     * <p>
     * int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
     * * @param queryWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     */
    void deleteByQuery(String email);


}
